#ifndef _EDATSMOVEEXPL_
#define _EDATSMOVEEXPL_

#include "edaMoveExpl.h"
#include "edaMoveGen.h"
#include "edaTabuList.h"
#include "edaAspirCrit.h"
#include "edaDefine.h"
#include "edaBestImprSelect.h"

class edaTSMoveExpl : public edaMoveExpl
{
  public:
    edaTSMoveExpl();
    edaTSMoveExpl(const edaMoveGen *_moveNext,
        const edaTabuList *_tabuList,
        const edaAspirCrit *_aspirCrit);
    edaTSMoveExpl(const edaTSMoveExpl &_moveExpl);
    ~edaTSMoveExpl();

    edaMoveExpl* clone() const;
    void explore(const edaMove *move,
		 edaSolution &oldSolution,
		 edaSolution &newSolution);

    virtual void Serialize(edaBuffer &buf, bool pack);

    setClassID(_SYSCLASSID_ + _CLSID_EDATSMOVEEXPL_);

  private:
    void clean();

    edaMoveGen *moveNext;
    edaTabuList *tabuList;
    edaAspirCrit *aspirCrit;
    edaBestImprSelect *moveSelect;
};

#endif
